﻿// CMplayer.cpp: 实现文件
//

#include "pch.h"
#include "ChatClient.h"
#include "CMplayer.h"
#include "afxdialogex.h"
#include <MMSystem.h>
#include <Digitalv.h>
#pragma comment(lib, "Winmm.lib")

//定义三个全局变量
HWND m_hWnd = ::FindWindow(NULL, "Dialog");;
DWORD DeviceId = 0;
MCI_OPEN_PARMS mciopenparms;



//加载
void Load(HWND hWnd, CString strFilepath)
{
	m_hWnd = hWnd;
	mciSendCommand(DeviceId, MCI_CLOSE, 0, 0); //在加载文件前先清空上一次播放的设备
	mciopenparms.lpstrElementName = strFilepath; //将音乐文件路径传给设备
	DWORD dwReturn;

	if (dwReturn = mciSendCommand(NULL, MCI_OPEN, MCI_OPEN_ELEMENT | MCI_WAIT, (DWORD)(LPVOID)&mciopenparms))
	{
		//如果打开玩家失败,将出错信息储存在buffer,并显示出错警告
		char buffer[256];
		mciGetErrorString(dwReturn, buffer, 256); //获取错误码对应的错误信息
		MessageBox(hWnd, buffer, "出错警告！", MB_ICONHAND | MB_ICONERROR | MB_ICONSTOP); //弹出错误信息提示对话框
	}
	DeviceId = mciopenparms.wDeviceID;
	//打开文件成功就关联文件到设备
}

//播放
void play()
{
	MCI_PLAY_PARMS mciplayparms;
	mciplayparms.dwCallback = (DWORD)m_hWnd;
	mciplayparms.dwFrom = 0; //每次播放都是从0开始播放
	mciSendCommand(DeviceId, MCI_PLAY, MCI_FROM | MCI_NOTIFY, (DWORD)(LPVOID)&mciplayparms);
}
//暂停、恢复、停止
void pause()
{
	mciSendCommand(DeviceId, MCI_PAUSE, 0, 0);
}
void resume()
{
	mciSendCommand(DeviceId, MCI_RESUME, 0, 0);
}
void stop()
{
	mciSendCommand(DeviceId, MCI_STOP, 0, 0);
	mciSendCommand(DeviceId, MCI_CLOSE, 0, 0);
	//当点击停止按钮时,将所有的信息都清除掉
}

// CMplayer 对话框

IMPLEMENT_DYNAMIC(CMplayer, CDialogEx)

CMplayer::CMplayer(CWnd* pParent /*=nullptr*/)
	: CDialogEx(IDD_Mplayer, pParent)
{

}

CMplayer::~CMplayer()
{
}

void CMplayer::DoDataExchange(CDataExchange* pDX)
{
	CDialogEx::DoDataExchange(pDX);
	DDX_Control(pDX, IDC_filename, m_edt);
}


BEGIN_MESSAGE_MAP(CMplayer, CDialogEx)
	ON_BN_CLICKED(IDC_exitbtn, &CMplayer::OnBnClickedexitbtn)
	ON_BN_CLICKED(IDC_filechoice, &CMplayer::OnBnClickedfilechoice)
	ON_EN_CHANGE(IDC_EDIT1, &CMplayer::OnEnChangeEdit1)
	ON_BN_CLICKED(IDC_play, &CMplayer::OnBnClickedplay)
	ON_BN_CLICKED(IDC_pause, &CMplayer::OnBnClickedpause)
	ON_BN_CLICKED(IDC_stop, &CMplayer::OnBnClickedstop)
	ON_WM_DROPFILES()
	ON_EN_CHANGE(IDC_filename, &CMplayer::OnEnChangefilename)
	ON_LBN_SELCHANGE(IDC_LIST1, &CMplayer::OnLbnSelchangeList1)
	ON_NOTIFY(LVN_ITEMCHANGED, IDC_LIST1, &CMplayer::OnLvnItemchangedList1)
	//ON_NOTIFY(LVN_ITEMCHANGED, IDC_LIST3, &CMplayer::OnLvnItemchangedList3)
END_MESSAGE_MAP()


// CMplayer 消息处理程序

CString strTemptxt;
void CMplayer::OnBnClickedexitbtn()
{
	// TODO: 在此添加控件通知处理程序代码

	GetDlgItem(IDC_filename)->GetWindowText(strTemptxt);
	CDialog::OnCancel(); //退出

}


void CMplayer::OnBnClickedfilechoice()
{
	// TODO: 在此添加控件通知处理程序代码

	char szFileFilter[] = "mp3文件(*.mp3)|*.mp3|"
		"wma文件(*.wma)|*.wma|"
		"wav文件(*.wav)|*.wav|"
		"所有文件(*.*)|*.*|";
	CFileDialog dlg(true, NULL, NULL, OFN_HIDEREADONLY, szFileFilter);
	if (dlg.DoModal() == IDOK)
	{
		CString strFilepath = dlg.GetPathName();
		CString strFilename = dlg.GetFileName();
		SetDlgItemText(IDC_filename, strFilename);
		startChoice = strFilename;
		Load(this->m_hWnd, strFilepath);
	}
	GetDlgItem(IDC_play)->EnableWindow(true); //文件读取成功时所有按钮变成可选
	GetDlgItem(IDC_pause)->EnableWindow(true);
	GetDlgItem(IDC_stop)->EnableWindow(true);

}


void CMplayer::OnEnChangeEdit1()
{
	// TODO:  如果该控件是 RICHEDIT 控件，它将不
	// 发送此通知，除非重写 CDialogEx::OnInitDialog()
	// 函数并调用 CRichEditCtrl().SetEventMask()，
	// 同时将 ENM_CHANGE 标志“或”运算到掩码中。

	// TODO:  在此添加控件通知处理程序代码
}


void CMplayer::OnBnClickedplay()
{
	// TODO: 在此添加控件通知处理程序代码
	play();
	SetDlgItemText(IDC_pause, "暂停");

}


void CMplayer::OnBnClickedpause()
{
	// TODO: 在此添加控件通知处理程序代码
	CString strTemp;
	GetDlgItemText(IDC_pause, strTemp); //获取按钮的状态
	if (strTemp.Compare("暂停") == 0)
	{
		pause();
		SetDlgItemText(IDC_pause, "恢复");
	}

	if (strTemp.Compare("恢复") == 0)
	{
		resume();
		SetDlgItemText(IDC_pause, "暂停");
	}
}


void CMplayer::OnBnClickedstop()
{
	// TODO: 在此添加控件通知处理程序代码
	stop();
	SetDlgItemText(IDC_pause, "暂停");
	GetDlgItem(IDC_play)->EnableWindow(false); //当按下stop的时候,播放和暂停不可选
	GetDlgItem(IDC_pause)->EnableWindow(false);

}

CString CMplayer::GetFileName(CString csFilePath)
{
	int nPos1 = csFilePath.ReverseFind('\\'); // 文件路径，以'\'斜杠分隔的路径  
	CString csFileFullName;
	csFileFullName = csFilePath.Right(csFilePath.GetLength() - nPos1 - 1); // 获取文件全名，包括文件名和扩展名 
	int nPos2 = csFileFullName.ReverseFind('.');
	CString  csFileName = csFileFullName.Left(nPos2); // 获取文件名  
	return csFileName;
}
void CMplayer::OnDropFiles(HDROP hDropInfo)
{
	// TODO: 在此添加消息处理程序代码和/或调用默认值
	UINT count;
	char filePath[200];
	count = DragQueryFile(hDropInfo, 0xFFFFFFFF, NULL, 0);
	if (count)
	{
		for (UINT i = 0; i < count; i++)
		{
			int pathLen = DragQueryFile(hDropInfo, i, filePath, sizeof(filePath));
			CString strFilePath = filePath;
			CString fileName = GetFileName(strFilePath);
			startDrop = fileName;
			SetDlgItemText(IDC_filename, fileName);
		}
	}
	DragFinish(hDropInfo);
	CDialog::OnDropFiles(hDropInfo);

	Load(this->m_hWnd, filePath);

}


void CMplayer::OnEnChangefilename()
{
	// TODO:  如果该控件是 RICHEDIT 控件，它将不
	// 发送此通知，除非重写 CDialogEx::OnInitDialog()
	// 函数并调用 CRichEditCtrl().SetEventMask()，
	// 同时将 ENM_CHANGE 标志“或”运算到掩码中。

	// TODO:  在此添加控件通知处理程序代码
}


void CMplayer::OnLbnSelchangeList1()
{
	// TODO: 在此添加控件通知处理程序代码

}

BOOL CMplayer::OnInitDialog()
{
	CDialogEx::OnInitDialog();
	//m_MusicList.InsertColumn(0, _T("编号"), LVCFMT_LEFT, 50);
	//m_MusicList.InsertColumn(1, _T("曲名"), LVCFMT_LEFT, 200);
	//m_MusicList.SetExtendedStyle(LVS_EX_GRIDLINES);

	// TODO:  在此添加额外的初始化
	return TRUE;  // return TRUE unless you set the focus to a control
				  // 异常: OCX 属性页应返回 FALSE
}


void CMplayer::OnLvnItemchangedList1(NMHDR* pNMHDR, LRESULT* pResult)
{
	LPNMLISTVIEW pNMLV = reinterpret_cast<LPNMLISTVIEW>(pNMHDR);
	// TODO: 在此添加控件通知处理程序代码
	*pResult = 0;
}


void CMplayer::OnLvnItemchangedList3(NMHDR* pNMHDR, LRESULT* pResult)
{
	LPNMLISTVIEW pNMLV = reinterpret_cast<LPNMLISTVIEW>(pNMHDR);
	// TODO: 在此添加控件通知处理程序代码
	*pResult = 0;
}
